/*
责任链模式（Chain of Responsibility Pattern）是一种行为型设计模式，它允许多个对象按照顺序处理请求，直到其中一个对象能够处理请求为止。
责任链模式将请求发送者和接收者解耦，使得多个对象都有机会处理请求，从而提高系统的灵活性和可扩展性。

责任链模式常用于以下场景：

1. 多个对象可以处理同一请求，但具体由哪个对象处理由运行时决定。
2. 需要动态指定处理请求的对象集合。
3. 需要在不明确接收者的情况下，将请求发送给多个对象。

下面是一个使用责任链模式的C语言例程，用于实现一个简单的日志记录系统：
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 日志级别枚举
typedef enum
{
    INFO,
    WARNING,
    ERROR
} LogLevel;

// 抽象处理者
typedef struct
{
    LogLevel level;
    struct Logger *next;
    void (*log)(struct Logger *logger, LogLevel level, const char *message);
} Logger;

void logMessage(Logger *logger, LogLevel level, const char *message)
{
    if (logger->level <= level)
    {
        logger->log(logger, level, message);
    }
    if (logger->next != NULL)
    {
        logMessage(logger->next, level, message);
    }
}

// 具体处理者
typedef struct
{
    Logger base;
    FILE *file;
} FileLogger;

void fileLoggerLog(Logger *logger, LogLevel level, const char *message)
{
    FileLogger *fileLogger = (FileLogger *)logger;
    fprintf(fileLogger->file, "[%d] %s\n", level, message);
}

FileLogger *createFileLogger(LogLevel level, const char *filename)
{
    FileLogger *fileLogger = (FileLogger *)malloc(sizeof(FileLogger));
    fileLogger->base.level = level;
    fileLogger->base.log = fileLoggerLog;
    fileLogger->file = fopen(filename, "a");
    return fileLogger;
}

// 客户端代码
int main()
{
    Logger *logger = (Logger *)createFileLogger(INFO, "log.txt");
    logger->next = (Logger *)createFileLogger(WARNING, "log.txt");
    logger->next->next = (Logger *)createFileLogger(ERROR, "log.txt");

    logMessage(logger, INFO, "This is an information message.");
    logMessage(logger, WARNING, "This is a warning message.");
    logMessage(logger, ERROR, "This is an error message.");

    return 0;
}

/*
在上面的例程中，首先定义了抽象处理者Logger，其中包含了一个日志级别作为内部状态，以及一个指向下一个处理者的指针。
在logMessage函数中，根据日志级别判断是否将日志消息传递给当前处理者，如果当前处理者无法处理该请求，则将请求传递给下一个处理者。
然后，定义了具体处理者FileLogger，其中包含了一个文件指针用于写入日志文件。
在fileLoggerLog函数中，将日志消息写入文件。
在createFileLogger函数中，创建了一个新的FileLogger对象，并设置日志级别和日志文件。
在main函数中，创建了一个责任链，并调用logMessage函数来记录日志。

通过使用责任链模式，我们可以将请求发送给多个对象，并由其中一个对象处理请求。
责任链模式适用于需要动态指定处理请求的对象集合，或者需要将请求发送给多个对象的场景。
*/